// 智能指针（很多时候都拥有它所指向的数据）引用（只借用数据）例如：String，Vec<T>，Box<T>，RC<T>，Ref<T>等
// 引用计数智能指针类型
// 智能指针通常使用struct实现并实现deref（允许智能指针struct的实例像引用一样使用）和drop（允许你自定义当智能指针实例走出作用域时的代码）这两个trait

// deref 解引用
// deref 隐式解引用转化（类似js的隐式转化）

// drop 预导入不需要手动引入 impl Drop for { fn drop (&mut self) {} } // 实现了drop方法

// Rc<T>引用计数智能指针，一个值有多个所有者，当引用值为0则清除 ---> 只适用于单线程
// Rc::clone()：增加引用，不会执行数据的深度拷贝
// 类型的clone()：会执行深度拷贝操作
// Rc<T>通过不可变引用，使你可以在程序不同部分共享只读数据

// RefCell<T>和内部可变性（只适用于单线程）
// borrow方法 返回Ref<T>
// borrow_mut方法 返回RefMut<T>
// 不同于Rc<T>,RefCell<T>类型代表了其持有数据的唯一所有权
// Box<T>（编译阶段强制代码遵守借用规则） vs RefCell<T>（运行时才检查借用规则）
// 可以使用Rc<T>结合RefCell<T>实现多重所有权可变数据

// 循环引用导致内存泄漏
// 可以通过弱引用解决

use::std::ops::Deref;
fn main() {
    let x = 5;
    let y = &x;
    let z = Box::new(x);
    assert_eq!(5, x);
    // assert_eq!(5, y);
    assert_eq!(5, *y); // 解引用
    assert_eq!(5, *z); // 解引用
    println!("hello world！");
}